#ifndef ABSTRACTCOMMAND_H
#define ABSTRACTCOMMAND_H


#include "ICommand.h"

namespace Command {


/**
 * Базовый абстрактный класс команд
 */
class AbstractCommand : public Common::ICommand
{
public:
	AbstractCommand(const QString& name = QString());

public:
	virtual void processResponse(QByteArray &data) = 0;

	virtual bool isWaitingForResponce() = 0;
	virtual bool isTimedOut(quint32 msec) = 0;

protected:
	virtual void execute() = 0;
	Common::Core* core() const;
	const Common::Core* coreConst() const;

	void sendData(quint8 msgType, const QByteArray& body);

	void setName(const QString& name);
	void setLogAfterExecute(const QString& log);
	void setLogAfterResponse(const QString& log);

private:
	// Не переопределять
	void execute(Common::Core* core); // final
	QString name() const;              // final
	QString logAfterExecute()  const;  // final
	QString logAfterResponse() const;  // final

private:
	Common::Core* _core;

	QString _name;
	QString _logAfterExecute;
	QString _logAfterResponse;
};

}

#endif // ABSTRACTCOMMAND_H
